package com.navinfo.tripanalysis.pojo;

import com.navinfo.tripanalysis.common.util.DateUtils;
import com.navinfo.tripanalysis.util.CommonUtils;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 行程预切分对象
 * @author 沈东生
 */
@Data
public class PreTripInfo {
    /**
     * 行程ID<br/>
     * 相同tid，同一天内，从1递增
     */
    private Integer tripId;
    /**
     * 行程开始时间，单位：毫秒ms<br/>
     * 使用0200第一个有效点
     */
    private Long startTimeMs;
    /**
     * 行程开始经度 ，单位：以度为单位乘以10的6次方<br/>
     * 使用0200第一个有效点
     */
    private int startLongitude;

    /**
     * 行程开始纬度 ，单位：以度为单位乘以10的6次方<br/>
     * 使用0200第一个有效点
     */
    private int startLatitude;
    /**
     * 行程开始高程，单位m<br/>
     * 使用0200第一个有效点
     */
    private int startHeight;
    /**
     * 行程开始方向，0-359正北为0顺时针<br/>
     * 使用0200第一个有效点
     */
    private int startDirection;

    /**
     * 行程结束时间，单位毫秒ms<br/>
     * 使用0200最后一个有效点
     */
    private Long endTimeMs;
    /**
     * 行程结束经度 ，单位：以度为单位乘以10的6次方<br/>
     * 使用0200最后一个有效点
     */
    private int endLongitude;
    /**
     * 行程结束纬度 ，单位：以度为单位乘以10的6次方<br/>
     * 使用0200最后一个有效点
     */
    private int endLatitude;
    /**
     * 行程结束高程，单位m<br/>
     * 使用0200最后一个有效点
     */
    private int endHeight;
    /**
     * 行程结束方向，0-359正北为0顺时针<br/>
     * 使用0200最后一个有效点
     */
    private int endDirection;

    /**
     * 当前行程根据0200精准的里程，单位米m<br/>
     */
    private Integer preciseMileage;
    /**
     * 当前行程根据0200精准的油耗，单位毫升mL<br/>
     */
    private Integer preciseFuel;
    /**
     * 行程强制结束标识（终端未上传行程结束的点） 1:强制结束 0:否
     * 前后两个点的时间间隔大于FORCE_END_DURATION_THRESHOLD，行程标记为1
     **/
    private Integer forceEndFlag;

    /**
     * 0f37匹配的点
     */
    private List<Point> subPoints0f37;
    /**
     * 0200匹配的点
     */
    private List<Point0200> subPoints0200;


    @Override
    public String toString(){
        StringBuilder sb=new StringBuilder();
        sb.append("PreTripInfo Start--------");
        sb.append("\n");
        sb.append("[All_]");
        sb.append(DateUtils.format(new Date(startTimeMs), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
        sb.append("||");
        sb.append(DateUtils.format(new Date(endTimeMs), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
        sb.append("||").append(getDurationStr((endTimeMs - startTimeMs)/1000));
        sb.append("\n");
        if(CommonUtils.isCollectionNotEmpty(subPoints0200)) {
            sb.append("[0200]");
            sb.append(DateUtils.format(new Date(subPoints0200.get(0).getGpsTime()), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
            sb.append("||");
            sb.append(DateUtils.format(new Date(subPoints0200.get(subPoints0200.size()-1).getGpsTime()), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
            sb.append("||").append(getDurationStr((subPoints0200.get(subPoints0200.size()-1).getGpsTime()-subPoints0200.get(0).getGpsTime())/1000));
            sb.append("||");
            sb.append(subPoints0200.size());
            sb.append("\n");
        }
        if(CommonUtils.isCollectionNotEmpty(subPoints0f37)) {
            sb.append("[0F37]");
            sb.append(DateUtils.format(new Date(subPoints0f37.get(0).getGpsTime()), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
            sb.append("||");
            sb.append(DateUtils.format(new Date(subPoints0f37.get(subPoints0f37.size()-1).getGpsTime()), DateUtils.DateFormat.YY_YY_MM_DD_HH_MM_SS));
            sb.append("||").append(getDurationStr((subPoints0f37.get(subPoints0f37.size()-1).getGpsTime()-subPoints0f37.get(0).getGpsTime())/1000));
            sb.append("||");
            sb.append(subPoints0f37.size());

            sb.append("\n");
        }
        sb.append("mileage:").append(preciseMileage);
        sb.append("\n");
        sb.append("fuel:").append(preciseFuel);
        sb.append("\n");
        sb.append("\n");
        sb.append("PreTripInfo end________");
        sb.append("\n");
        return sb.toString();
    }

    private String getDurationStr(long timeS) {
        String str = "";
        if (timeS < 0) {
            str += "负";
            timeS = -timeS;
        }
        long d = timeS / 86400;
        long h = timeS % 86400 / 3600;
        long m = (timeS % 3600) / 60;
        long s = (timeS) % 60;

        if (d > 0) {
            str += d + "日";
        }
        if (h > 0) {
            str += h + "时";
        }
        if (m > 0) {
            str += m + "分";
        }
        if (s > 0) {
            str += s + "秒";
        }
        return str;
    }
}
